Sé que puede aplicar un comodín en el atributo de ruta para permitir / como la entrada de fecha, por ejemplo:
[Route("orders/{*orderdate}")]El problema con el comodín solo se aplica al último parámetro en URI. ¿Cómo resuelvo el problema si quiero tener el siguiente URI:
[Route("orders/{orderdate}/customers")]Actualizar:
Sé que hay pocas opciones para resolver el problema refactorizando el código, así que no ofrezca una solución como:
[Route("orders/customers/{orderdate}")]"dd-mm-yyyy" )@bet... Creo que genericUriParserOptions ya no es aplicable a .net 4.5 o posterior...
También como lo sugiere @JotaBe , es posible que deba decodificar correctamente la solicitud de URL. En la mayoría de los casos, %2F se traducirá automáticamente a una barra inclinada '/' . Entonces, si necesita escapar, deberá decodificar el carácter '%' en primer lugar ... por lo que su URL: se verá así: www.domain.com/api/orders/23%252F06%252F2015/customers
Observe que los caracteres '%252F' se traducirán al '%2F' real
EDITAR
Ok, aquí está la solución completa (lo probé y funcionó para mí):
Suponiendo que tiene un punto final de API como este:
[Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { } En web.config , deberá configurar requestPathInvalidCharacters para que esté vacío, lo que le indica a asp.net que permita todas las solicitudes
<system.web> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/> </system.web> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer> Cuando el cliente envíe la solicitud a la API, deberá asegurarse de escapar del '%' siguiente manera:
www.dominio.com/api/pedidos/23%252F06%252F2015/clientes
A continuación, debe decodificar la solicitud.
[Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015 }Como se señaló en el comentario de @AlexeiLevenkov, esto está mal:
No puede tener un parámetro en la URL que acepte barras diagonales, porque este es un símbolo especial que separa cada fragmento de URL. Por lo tanto, cada vez que incluya este símbolo en su URL, habrá nuevos fragmentos y un solo parámetro no puede incluir varios fragmentos.
Si quieres más detalles, lee esto , pero estos son los extractos más relevantes:
? o # encontrado en la URL. Por lo tanto, las barras inclinadas solo crean fragmentos en la sección de la ruta de la URL antes de la ocurrencia de uno de esos símbolos. Por lo tanto, la cadena de consulta puede incluir barras diagonales, / , si lo desea, y no definirán segmentos de ruta en absoluto.
Estas son algunas soluciones para la pregunta:
[Route("orders/{month}/{day}/{year}/customers")] y luego cree la fecha en el lado del servidor NOTA: su pregunta original decía "cadena de consulta", y mi comentario sobre la codificación se refería a la cadena de consulta, que es el último segmento de una URL después del signo de interrogación, si está presente, like &id=27 . Corregí su pregunta para que no mencione "cadena de consulta", que no era el nombre correcto para lo que necesita
Puede usar el siguiente URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")] y luego usar un archivador de modelo personalizado para tomar DD/MM/YY y conviértalos en una fecha que pueda vincular en su método de acción.
Puede elegir cómo desea manejar las restricciones (ser más estricto con las expresiones regulares) o usar la validación y devolver 400 si no coincide.
El enfoque más simple es tomar el Day/Month/Year y juntarlo en código.
Aquí hay un enlace para tratar con modelbinding .